#include "./BSP/ULTRASOUND/ultrasound.h"
#include "./PORT/port.h"
#include "../System/config.h"
#include "./BSP/DEBUG/debug.h"

#if CFG_ULTRASOUND_EN == 1

/**
 * @brief       初始化超声波模块
 * @param       无
 * @retval      无
 */
void ultrasound_init(void)
{
    // 初始化ECHO引脚为输入捕获模式
    tim_cap_pin_init(CFG_ULTRASOUND_ECHO_TIM_ID, CFG_ULTRASOUND_ECHO_TIM_CHANNEL, CFG_ULTRASOUND_ECHO_PIN, CFG_ULTRASOUND_ECHO_TIM_ARR, CFG_ULTRASOUND_ECHO_TIM_PSC);

    // 初始化TRIG引脚为输出模式
    gpio_pin_init(CFG_ULTRASOUND_TRIG_PIN, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_HIGH, GPIO_PUPD_NONE);
    gpio_write_pin(CFG_ULTRASOUND_TRIG_PIN, 0); // 初始化为低电平
    // tim_int_callback_register(ultrasound_tim_overflow_handler, 1000);
    // 初始化HC-SR04信息结构体
}

/**
 * @brief       触发超声波测距并读取距离（可以300ms调用一次）
 * @param       无
 * @retval      距离值(单位:cm)
 */
float ultrasound_read_distance(void)
{
    uint32_t high_level_us = 0;
    float distance = 0.0f;
    ultrasound_start();
    delay_ms(60); // 等待测距完成，HC-SR04最大测距时间约38ms
    high_level_us = tim_cap_get_value(CFG_ULTRASOUND_ECHO_TIM_ID);
    distance = high_level_us * 0.034f / 2.0f;

    // 测距结果限幅
    if (distance >= 450.0f)
    {
        distance = 450.0f;
    }
    my_printf("lhigh_level_us:%d distance:%.2f\r\n", high_level_us, distance);
    return distance;
}

/**
 * @brief       触发超声波测距
 * @param       无
 * @retval      无
 */
void ultrasound_start(void)
{
    gpio_write_pin(CFG_ULTRASOUND_TRIG_PIN, 1);
    delay_us(12); // 延时12us，满足>10us的要求
    gpio_write_pin(CFG_ULTRASOUND_TRIG_PIN, 0);
    tim_cnt_set_value(CFG_ULTRASOUND_ECHO_TIM_ID, 0);
}

/**
 * @brief       读取距离值
 * @param       无
 * @retval      距离值(单位:cm)
 */
// float ultrasound_read(void)
// {
//     uint32_t us = 0;
//     float dis = 0.0f;
//     Hcsr04Info.high_level_us = tim_cap_get_value(CFG_ULTRASOUND_ECHO_TIM_ID);
//     dis = Hcsr04Info.high_level_us;
//     my_printf("lhigh_level_us:%d distance:%.2f\r\n", Hcsr04Info.high_level_us, dis);
//     // 测距结果限幅
//     if (Hcsr04Info.distance >= 450.0f)
//     {
//         Hcsr04Info.distance = 450.0f;
//     }
//     my_printf("high_level_us:%d distance:%f\r\n", Hcsr04Info.high_level_us, Hcsr04Info.distance);
//     return Hcsr04Info.distance;
// }

#endif
